<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
    <!-- 点击按钮弹出警告:你别点我 -->
    <input type="button" value="点击"onclick="(function(){alert('你别点我');})()">
<script>
    //函数表达式:把函数当做一个值赋给变量
    //注意: 函数表达式必须先声明，再调用 
    let f1 = function fun(){
        console.log('hello f1' );
    };
    //函数调用:变量名()调用 
    f1();
    let f2 = function fun2(name){
        console.log('hello'+name);
    };
    f2('张三');
    //匿名函数
    let f3 = function(a,b){
        return a<b?a:b;
    };
    console.log(f3(23,56));
    //立即执行函数:匿名函数自调用。用()括起来的部分是一个整体。
    (function(a,b){
        console.log(a+b);
    })(1,2);

    let a = function(){
        console.log(1);
    };
    console.log(typeof a); //函数数据类型:属于object，和数组一样。
    //把函数这个值作为实参传给另一个函数
    //回调函数:把函数A当做参数传给函数B，在函数B中调用函数A，此时函数A叫做回调函数。
    console.log('----------------------------------------------------------');	
    let myf1 =function(a){
        let b=123;
        let res = a( ); 
        console.log(res);
    };
    let myf2 =function( ){
        console.log('myf2' );
    }
    myf1(myf2);
    //递归函数:在函数中调用自己。
    //阶乘:10!=10*9*8*7*6...*1>10*(9!)>10*9*(8!)>10*9*8*(7!) 
    let jc=function(n){
        if(n===1){
        return 1;
        }else{
        return n*jc(n-1);
        }
    }
    console.log(jc(10));
    console.log('----------------------------------------------------------');
    function test(a,b){ 
        let nc=a+b;
    }
    function test2(){
        return 0;
    }
</script>
</html>